package com.csdj.crm.service;

import com.csdj.crm.base.BaseService;
import com.csdj.crm.dao.UserMapper;
import com.csdj.crm.model.UserModel;
import com.csdj.crm.utils.AssertUtil;
import com.csdj.crm.utils.Md5Util;
import com.csdj.crm.utils.UserIDBase64;
import com.csdj.crm.vo.User;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;

/**
 * 用户模块 逻辑业务层
 */
@Service
public class UserService extends BaseService<User, Integer> {


    @Resource
    private UserMapper userMapper;

    /**登录操作
     * @param userName
     * @param userPwd
     */
    public UserModel userLogin(String userName, String userPwd) {
        /*1.参数判断 判断用户姓名、用户密码非空 */

        checkLoginParams(userName, userPwd);

        //2. 调用数据访问层 通过用户名查询用户记录 返回用户对象
        User user = userMapper.queryUserByName(userName);
        //3.判断用户对象是否为空
        AssertUtil.isTrue(user == null, "用户姓名不存在!");
        //4. 如果对象存在 比较密码 密码不能直接公开 所以先加密

        checkUserPwd(userPwd,user.getUserPwd());

        //返回构建对象
      return   buildUserInfo(user);
    }

    private UserModel buildUserInfo(User user) {
        UserModel userModel=new UserModel();
        userModel.setUserIdStr(UserIDBase64.encoderUserID(user.getId()));
        userModel.setUserName(user.getUserName());
        userModel.setTrueName(user.getTrueName());
        return userModel;
    }

    /**
     *密码判断 先将客户端密码加密 再与数据库种查询到的密码做比较
     * @param userPwd -->输入的
     * @param pwd  -->数据库种的
     */
    private void checkUserPwd(String userPwd, String pwd) {
        //1.先将客户端输入的密码加密

        userPwd= Md5Util.encode(userPwd);

        //判断密码是否相等
        AssertUtil.isTrue(!userPwd.equals(pwd),"用户密码不正确");

    }

    /**
     * 验证用户名 密码 不为空
     *
     * @param userName
     * @param userPwd
     */
    private void checkLoginParams(String userName, String userPwd) {
        //验证用户名
        AssertUtil.isTrue(StringUtils.isBlank(userName), "用户姓名不能为空!");
        AssertUtil.isTrue(StringUtils.isBlank(userPwd), "用户密码不能为空!");

    }


    /**
     * 修改密码
     * @param userId
     * @param oldPwd
     * @param newPwd
     * @param repeatPwd
     */
    @Transactional(propagation = Propagation.REQUIRED)
    public void updatePassword(Integer userId,String oldPwd,String newPwd,String repeatPwd){
        //通过用户Id查询用户记录 返回用户对象
      User user= userMapper.selectByPrimaryKey(userId);
      //判断用户记录是否存在
        AssertUtil.isTrue(user==null,"待更新记录不存在");
        //参数校验
        checkPasswordParams(user,oldPwd,newPwd,repeatPwd);

        //设置用户的新密码
        user.setUserPwd(Md5Util.encode(newPwd));

        //执行更新 判断受影响的行数
        AssertUtil.isTrue(userMapper.updateByPrimaryKeySelective(user)<1,"用户修改密码失败！");

    }

    /**
     * 修改密码 参数校验
     * @param user
     * @param oldPwd
     * @param newPwd
     * @param repeatPwd
     */
    private void checkPasswordParams(User user, String oldPwd, String newPwd, String repeatPwd) {

        //原始密码 非空校验
        AssertUtil.isTrue(StringUtils.isBlank(oldPwd),"原始密码不能为空！");
        //判断原始密码是否正确（查询的用户对象中的用户密码是否与原始密码一致)
        AssertUtil.isTrue(!user.getUserPwd().equals(Md5Util.encode(oldPwd)),"原始密码不正确!");
       // 判断新密码是否为空
        AssertUtil.isTrue(StringUtils.isBlank(newPwd),"新密码不能为空！");
        // 判断新密码是否与原始密码一致 （不允许新密码与原始密码）
        AssertUtil.isTrue(oldPwd.equals(newPwd),"新密码不能与原始密码相同!");
        //判断确认密码是否为空
        AssertUtil.isTrue(StringUtils.isBlank(repeatPwd),"确认密码不能为空！");
        //判断确认密码是否与新密码一致
        AssertUtil.isTrue(!newPwd.equals(repeatPwd),"确认密码与新密码不一致!");

    }


    /**
     * 查询所有的销售人员
     * @return
     */
    public List<Map<String,Object>> queryAllSales(){

        return userMapper.queryAllSales();
    }

}
